#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a;

    // 一级指针，分成两步理解：
    // 1:  (*p)    (*k)     (*q2)    指针本身的定义
    // 2:  int     char    float *   指针的目标类型
    int *p;    // p的类型是int *
    char *k;   // k的类型是char *
    float **q2;// q2的类型是float **
    p = &a;

    // 多级指针，分成两步理解：
    // 1:  (*p2)    (*k2)     (*q3)     指针本身的定义
    // 2:  int *    char *   float **   指针的目标类型
    int *   (*p2) = &p;  // p2 --> p --> a
    char *  (*k2) = &k;  // k2 --> k
    float **(*q3) = &q2; // q3 --> q2

    // 以下三句话效果等价：
    a = 100;
    *p = 100;
    **p2 = 100;

    // 复杂练习：
    int   w  [10]; // w的类型是 int [10]
    int ( *pw )[10]; // 一级指针
    int (**pw2)[10]; // 二级指针, pw2 --> pw --> w
    pw = &w;   // pw --> w
    pw2 = &pw; // pw2 --> pw

    // 以下三句话效果等价：
      w  [0]   = 666;
    (*pw)[0]   = 666;
    (**pw2)[0] = 666;

    return 0;
}
